package com.xcjh.opencv;

import com.xcjh.opencv.emuns.MatchImage;
import lombok.Data;
import org.opencv.core.Core;

import java.awt.*;
import java.awt.event.InputEvent;

@Data
public class ExeRule {


    private Core.MinMaxLocResult mmr;
    private Robot robot;


    /**
     * 移动鼠标
     * @param x
     * @param y
     */
    public void moveTo(Integer x, Integer y) {
        moveToByRobot(x,y,robot);
    }
    public static void moveToByRobot(Integer x, Integer y,Robot robot) {
        robot.mouseMove(x, y);
    }

    /**
     * 延迟
     * @param time
     */
    public void delay(Integer time) {
        delayByRobot(time,robot);
    }
    public static void delayByRobot(Integer time,Robot robot) {
        long start=System.currentTimeMillis();
        robot.delay(time>=60000?59999:time);
        long end=System.currentTimeMillis();
        if( (end+5-start)<time ){
            System.out.println("#######预计睡眠"+time+" 实际睡眠"+(end-start));
        }
    }

    /**
     * 左键按下
     *
     * @param count
     */
    public void leftDown(Integer count) {
        leftDownByRobot(count,robot);
    }
    public static void leftDownByRobot(Integer count,Robot robot) {
//        InputEvent.BUTTON1_DOWN_MASK：代表鼠标左键。
//        InputEvent.BUTTON2_DOWN_MASK：代表鼠标中键。
//        InputEvent.BUTTON3_DOWN_MASK：代表鼠标右键。
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * 右键按下
     *
     * @param count
     */
    public void rightDown(Integer count) {
        rightDownByRobot(count,robot);
    }
    public static void rightDownByRobot(Integer count,Robot robot) {
//        InputEvent.BUTTON3_DOWN_MASK：代表鼠标右键。
        robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
    }

    /**
     * 左键弹起
     *
     * @param count
     */
    public void leftUp(Integer count) {
        leftUpByRobot(count,robot);
    }
    public static void leftUpByRobot(Integer count,Robot  robot) {
//        InputEvent.BUTTON1_DOWN_MASK：代表鼠标左键。
//        InputEvent.BUTTON2_DOWN_MASK：代表鼠标中键。
//        InputEvent.BUTTON3_DOWN_MASK：代表鼠标右键。
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * 右键弹起
     *
     * @param count
     */
    public void rightUp(Integer count) {
        rightUpByRobot(count,robot);
    }
    public static void rightUpByRobot(Integer count,Robot robot) {
//        InputEvent.BUTTON1_DOWN_MASK：代表鼠标左键。
//        InputEvent.BUTTON2_DOWN_MASK：代表鼠标中键。
//        InputEvent.BUTTON3_DOWN_MASK：代表鼠标右键。
        robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
    }

    /**
     * 左键单击
     *
     * @param count
     */
    public void leftClick(Integer count) {
        leftClickByRobot(count,robot);
    }
    public static void leftClickByRobot(Integer count,Robot robot) {
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.delay(50);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * 右键单击
     *
     * @param count
     */
    public void rightClick(Integer count) {
        rightClickByRobot(count,robot);
    }
    public static void rightClickByRobot(Integer count,Robot robot) {
        robot.mousePress(InputEvent.BUTTON3_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
    }

    /**
     * 中键单击
     *
     * @param count
     */
    public void middleClick(Integer count) {
        middleClickByRobot(count,robot);
    }
    public static void middleClickByRobot(Integer count,Robot robot) {
        robot.mousePress(InputEvent.BUTTON2_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
    }


    /**
     * 左键双击
     *
     * @param count
     */
    public void leftDoubleClick(Integer count) {
        leftDoubleClickByRobot(count,robot);
    }
    public static void leftDoubleClickByRobot(Integer count,Robot robot) {
        // 第一次点击
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

        // 延时一小段时间
        robot.delay(100);

        // 第二次点击
        robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * 鼠标中键滚动
     * @param count
     */
    public void mouseWheel(Integer count){
        mouseWheelByRobot(count,robot);
    }
    public static void mouseWheelByRobot(Integer count,Robot robot){
        //wheelAmt的取值可以是任意整数，但通常情况下，滚动一个单位的量相当于滚轮在一个刻度上滚动，通常为1。如果需要滚动更多的单位，可以将wheelAmt设置为大于1的整数。
        robot.mouseWheel(count);
    }

    /**
     * 键盘按下
     * @param key 字母
     * @param count
     */
    public void keyDown(String key,Integer count){
        keyDownByRobot(key,count,robot);
    }
    public static void keyDownByRobot(String key,Integer count,Robot robot){
        robot.keyPress(KeyMap.getKey(key));
    }

    /**
     * 键盘按弹起
     * @param key 字母
     * @param count
     */
    public void keyUp(String key,Integer count){
        keyUpByRobot(key,count,robot);
    }
    public static void keyUpByRobot(String key,Integer count,Robot robot){
        robot.keyRelease(KeyMap.getKey(key));
    }

}
